<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>prototype</title>
    <script>
        /**
         * 原型
         *
         * 任何构造函数( Object除外)都具有prototype属性，叫做显示原型，
         * 显示原型属性随着函数对象创建而创建，默认指向一个object空对象(没有函数本身的属性)
         * 
         * 每个实例对象都有一个__proto__对象，隐式原型，随着实例对象创建而创建
         * 
         * 原型对象中的constructor属性，指向函数对象，构造函数和原型对象相互引用
         */
        console.log(Date.prototype)
        console.log(Date.prototype.constructor === Date)
        
        function Fun() {
            
        }
        
        // 为原型对象添加属性（方法），供实例对象访问
        Fun.prototype.test = function() {
            console.log('test');
        }
        
        console.log(Fun.prototype)
        
        var fun = new Fun();
        fun.test(); // 现在类型对象里面找，找不到从隐式原型__proto__里面找
        console.log(fun.__proto__)
        
        // 隐式原型的值为其构造函数的显式原型的值
        console.log(fun.__proto__ === Fun.prototype)
        
    </script>
</head>
<body>
    
</body>
</html>
